home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus Special 18
/
AMIGAplus Sonderheft 18 (1999)(ICP)(DE)[!].iso
/
Forum
/
MichaelRoth
/
3-3-99
/
subs
/
CheckSumm.b.w.l.asm
next >
Wrap
Assembly Source File
|
1998-08-15
|
3KB
|
77 lines
Xref GetChecksumByte
Xref GetChecksumWord
Xref GetChecksumLong
; A0 -> Key
; D0 -> Länge des Keys (word Grenze!)
; D0 <- CheckSumme
GetChecksumByte
movem.l d1,-(sp)
moveq #0,d1
move.b (a0)+,d1
sub.w #2,d0
.loop
eor.b (a0)+,d1
dbra d0,.loop
move.l d1,d0
movem.l (sp)+,d1
rts
GetChecksumWord
movem.l d1/d7,-(sp)
move.l d0,d1 ; Länge nach D0
duvu.l #2,d1 ; Dividiren
swap d1 ; Rest ins untere Word
moveq #0,d1 ; Rest löschen
swap d1 ; wieder wechseln
sub.w d1,d7 ; nach d7
lsl.l #1,d1 ; mit 2 Multiplizieren
sub.w d1,d0 ; Rest bestimmen
moveq #0,d1 ; Register löschen
move.w (a0)+,d1 ; 1 Word lesen
sub.w #2,d7 ; 2 Abziehen (1 für DBcc und 1 wegen 1 bereits gelesenen Word)
.loop
eor.w (a0)+,d1 ; CheckSumm bilden
dbra d7,.loop ;
tst.w d0 ; Prüfen ob Rest = 0
beq .end ; Wenn ja beenden
eor.b (a0)+,d1 ; Ansonsten Leztes Byte verwerten
.end
move.l d1,d0 ; Checksumme nach D0
movem.l (sp)+,d1/d7
rts
GetChecksumLong
movem.l d1/d7,-(sp)
move.l d0,d1 ; Länge nach D0
duvu.l #4,d1 ; Dividiren
swap d1 ; Rest ins untere Word
moveq #0,d1 ; Rest löschen
swap d1 ; wieder wechseln
sub.w d1,d7 ; nach d7
lsl.l #2,d1 ; mit 2 Multiplizieren
sub.w d1,d0 ; Rest bestimmen
moveq #0,d2
move.w (a0)+,d1
sub.w #1,d7
.loop
eor.l (a0)+,d1
dbra d7,.loop
move.l d1,d0
cmp.w #2,d0 ; Weniger als 2 Bytes übrig ?
blt .1 ; Nein -> .1
eor.w (a0)+,d1 ; Ansonsten 1 Wort berechnen
sub.w #2,d0 ; Und Zähler verringern
.1
cmp.w #1,d0 ; 1 Byte über ?
blt .end ; Nein beenden
eor.b (a0)+,d1 ; Ansonsten auch noch mitnehmen
.end
move.l d1,d0
movem.l (sp)+,d1/d7
rts